home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / graphics / quicktim / qtimevcr.cpt / SLINK's VCR QuickTime / MP Source / vcr.c < prev   
Encoding:
C/C++ Source or Header  |  1992-06-16  |  12.5 KB  |  610 lines

  1. #include <stdio.h>
  2. #include <oops.h>
  3. #include <Movies.h>
  4.  
  5. #include "myQuickTime.h"
  6.  
  7. #include "Dlog.h"
  8. #include "Alert_Class.h"
  9.  
  10. #include "vcr.h"
  11. #include "mycolors.h"
  12.  
  13. extern EventRecord gEvent;
  14. extern Alert_Class *myAlert;
  15. extern QT *myQT;
  16.  
  17. Rect myRects[4]; // This global saves calls to GetDItem over and over
  18.                 // these rects are user Items in the resource file
  19.                 // used to place the buttons where I want them.
  20.  
  21. Boolean blink = false;
  22. long oldTick, newTick;
  23. int currentrect = 0;
  24. Boolean clockSet = false;
  25.  
  26. extern Boolean opened;
  27.  
  28. /*....................................................................*/
  29. VCR::VCR()
  30. {
  31.     Buttons myButtons;
  32.     int i;
  33.     int rsrcNum;
  34.     
  35.     myButtons = (*this).myButtons;
  36.     
  37.     
  38.     for(i = 0,rsrcNum = BASE_ICON-1; i < LAST_BUTTON; i++,rsrcNum++) {
  39.         myButtons.button[i] = false;
  40.         myButtons.buttonRNum[i] = rsrcNum;
  41.     }
  42.     (*this).myButtons = myButtons;
  43.     vcr_mode = stopped;
  44. }
  45. /*....................................................................*/
  46. VCR::~VCR()
  47. {
  48.     Buttons myButtons;
  49.     int i;
  50.     int rsrcNum;
  51.     
  52.     myButtons = (*this).myButtons;
  53.     
  54.     
  55.     for(i = 0,rsrcNum = BASE_ICON; i < LAST_BUTTON; i++,rsrcNum++) {
  56.         myButtons.button[i] = false;
  57.         myButtons.buttonRNum[i] = rsrcNum;
  58.     }
  59.     (*this).myButtons = myButtons;
  60. }
  61. /*....................................................................*/
  62. void VCR::loadResource( int number)    // load resource from resource file
  63. {
  64.     DialogPtr myDlog;
  65.     
  66.     /*-------------------------
  67.     Shadow for purging problems
  68.     -------------------------*/
  69.     myDlog = this->myDlog;
  70.     rsrcNumber = number;
  71.     myDlog = GetNewDialog(number,0L,(WindowPtr)-1L);
  72.     
  73.     if ( myDlog == 0L  ) {
  74.         SysBeep(7);
  75.         (*myAlert).AlertStop("\pFatal Error",
  76.                             "\pUnable to allocate new dialog",
  77.                             "\pDlog::loadResource",NULL);
  78.     } /* end if */
  79.     
  80.     CouldDialog(rsrcNumber);    // could be purged so lock it down
  81.  
  82.  
  83.  
  84.     
  85.     GetDItem(myDlog,PROGRESS_1,&itemType,&itemHandle,&itemRect);
  86.     myRects[0] = itemRect;
  87.     
  88.     GetDItem(myDlog,PROGRESS_2,&itemType,&itemHandle,&itemRect);
  89.     myRects[1] = itemRect;
  90.  
  91.     GetDItem(myDlog,PROGRESS_3,&itemType,&itemHandle,&itemRect);
  92.     myRects[2] = itemRect;
  93.  
  94.     GetDItem(myDlog,PROGRESS_4,&itemType,&itemHandle,&itemRect);
  95.     myRects[3] = itemRect;
  96.  
  97.     /*-------------------------
  98.     Copy back from shadow
  99.     -------------------------*/
  100.     this->myDlog = myDlog;
  101.  
  102. }
  103. /*....................................................................*/
  104. int VCR::HandleDialogItem(int itemHit, Point thePoint, int thePart)
  105. {
  106.     DialogPtr myDlog;
  107.     Buttons myButtons;
  108.     
  109.     myDlog = this->myDlog;
  110.     myButtons = (*this).myButtons;
  111.     
  112.     switch ( itemHit  ) {
  113.         case PLAY_BUTTON:
  114.             if (!opened) { SysBeep(7); break;}
  115.             if (myButtons.button[PLAY_BUTTON] == false) {
  116.                 (*this).myButtons = myButtons;
  117.                 ButtonsAndValues(PLAY_BUTTON);
  118.                 (*this).vcr_mode = playing;
  119.                 (*myQT).PlayMovie();
  120.             }
  121.         break;
  122.         
  123.         case STOP_BUTTON:
  124.             if (!opened) { SysBeep(7); break;}
  125.  
  126.             if (myButtons.button[STOP_BUTTON] == false) {
  127.                 (*this).vcr_mode = stopped;
  128.                 (*this).myButtons = myButtons;
  129.                 ButtonsAndValues(STOP_BUTTON);
  130.                 myButtons = (*this).myButtons;
  131.                 myButtons.button[STOP_BUTTON] = false;
  132.                 (*this).myButtons = myButtons;
  133.                 RedrawButtons();
  134.                 DrawAllProgress(sl_darkGray);
  135.                 (*myQT).StopMyMovie();
  136.             }
  137.         break;
  138.         
  139.         case FF_BUTTON:
  140.             if (!opened) { SysBeep(7); break;}
  141.             if (myButtons.button[FF_BUTTON] == false) {
  142.                 (*this).vcr_mode = fastforward;
  143.                 (*this).myButtons = myButtons;
  144.                 ButtonsAndValues(FF_BUTTON);
  145.                 (*myQT).FFMyMovie();
  146.             }
  147.         break;
  148.         
  149.         case GO_START_BUTTON:
  150.             if (!opened) { SysBeep(7); break;}
  151.             if (myButtons.button[GO_START_BUTTON] == false) {
  152.                 (*this).myButtons = myButtons;
  153.                 (*this).vcr_mode = gotostart;
  154.                 ButtonsAndValues(GO_START_BUTTON);
  155.                 myButtons = (*this).myButtons;
  156.                 myButtons.button[GO_START_BUTTON] = false;
  157.                 (*this).myButtons = myButtons;
  158.                 RedrawButtons();
  159.                 (*myQT).GoStartMyMovie();
  160.             }
  161.             break;
  162.             
  163.         case GO_END_BUTTON:
  164.             if (!opened) { SysBeep(7); break;}
  165.             if (myButtons.button[GO_END_BUTTON] == false) {
  166.                 (*this).vcr_mode = gotoend;
  167.                 (*this).myButtons = myButtons;
  168.                 ButtonsAndValues(GO_END_BUTTON);
  169.                 myButtons = (*this).myButtons;
  170.                 myButtons.button[GO_END_BUTTON] = false;
  171.                 (*this).myButtons = myButtons;
  172.                 RedrawButtons();
  173.                 (*myQT).GoEndMyMovie();
  174.             }
  175.             break;
  176.             
  177.         case RW_BUTTON:
  178.             if (!opened) { SysBeep(7); break;}
  179.             if (myButtons.button[RW_BUTTON] == false) {
  180.                 (*this).vcr_mode = re_wind;
  181.                 (*this).myButtons = myButtons;
  182.                 ButtonsAndValues(RW_BUTTON);
  183.                 (*myQT).RWMyMovie();
  184.             }
  185.             break;
  186.         case CLOCK_BOX:
  187.             clockSet = true;
  188.             break;
  189.             
  190.         case VCR_BOX:{
  191.                 Rect bRect;
  192.                 SelectWindow(myDlog);
  193.                 bRect = screenBits.bounds;
  194.                 DragWindow(myDlog,gEvent.where, &bRect);
  195.             }    
  196.             break;
  197.         
  198.         case TAPE_SLOT:
  199.             if (opened) {
  200.                 (*myQT).CloseMovie();
  201.                 opened = false;
  202.             }
  203.             else {
  204.                 opened = (*myQT).OpenMovie();
  205.             }    
  206.         
  207.             break;
  208.             
  209.             
  210.         default: break;
  211.     } /* end switch */
  212.     //(*this).myButtons = myButtons;
  213. }
  214. /*....................................................................*/
  215. void VCR::RedrawDialog()
  216. {
  217.     DialogPtr myDlog;
  218.     GrafPtr oldPort;
  219.     int i;
  220.     
  221.     GetPort(&oldPort);
  222.     myDlog = (*this).myDlog;
  223.     
  224.     SetPort(myDlog);
  225.     DrawDialog(myDlog);
  226.     RedrawButtons();
  227.     RedrawStatus();
  228.     RedrawTime();
  229.     SetPort(oldPort);
  230. }
  231. /*....................................................................*/
  232. void VCR::ButtonsAndValues(int itemHit)
  233. {
  234.     DialogPtr myDlog;
  235.     int i;
  236.     Buttons myButtons;
  237.     
  238.     
  239.     myDlog = (*this).myDlog;
  240.     myButtons = (*this).myButtons;
  241.  
  242.     for(i = 1; i < LAST_BUTTON; i++) {
  243.         if (i == itemHit) {
  244.             myButtons.button[i] = true;
  245.         }
  246.         else {
  247.             myButtons.button[i] = false;
  248.         }
  249.     }
  250.  
  251.     (*this).myButtons = myButtons;
  252.     RedrawButtons();
  253. }
  254. /*....................................................................*/
  255. void VCR::RedrawButtons()
  256. {
  257.     DialogPtr myDlog;
  258.     int itemType;
  259.     Handle itemHandle;
  260.     Rect itemRect;
  261.     CIconHandle    icon;
  262.     int i;
  263.     GrafPtr oldPort;
  264.     Buttons myButtons;
  265.     RGBColor fc,bc;
  266.     RGBColor temp;
  267.     
  268.     GetForeColor(&fc);
  269.     GetBackColor(&bc);
  270.     
  271.     temp.red = temp.green = temp.blue = 0xffff;
  272.     RGBBackColor(&temp);
  273.     temp.red = temp.green = temp.blue = 0x0000;
  274.     RGBForeColor(&temp);
  275.     
  276.     GetPort(&oldPort);
  277.     myDlog = (*this).myDlog;
  278.     myButtons = (*this).myButtons;
  279.     
  280.     SetPort(myDlog);
  281.     
  282.     for(i = 1; i < LAST_BUTTON; i++) {
  283.         if (myButtons.button[i] == true) {
  284.             GetDItem(myDlog,i,&itemType,&itemHandle,&itemRect);
  285.             icon = GetCIcon(myButtons.buttonRNum[i]);
  286.             if (icon == NULL) {
  287.                 SysBeep(7);
  288.                 (*myAlert).AlertStop("\pFatal Error",
  289.                             "\pUnable to get cicn resource",
  290.                             "\pVCR::RedrawButtons",NULL);
  291.             }
  292.             
  293.             HLock( icon );
  294.             HLock( (**icon).iconData );
  295.         
  296.             (**icon).iconPMap.baseAddr = *(**icon).iconData;
  297.             (**icon).iconMask.baseAddr = (Ptr)&(**icon).iconMaskData;
  298.             
  299.             CopyBits( &(**icon).iconPMap, &myDlog->portBits,
  300.                         &(**icon).iconPMap.bounds, &itemRect, notSrcCopy, 0 );
  301.         
  302.             HUnlock( (**icon).iconData );
  303.             HUnlock( icon );
  304.             DisposCIcon(icon);
  305.         }
  306.         else {
  307.             GetDItem(myDlog,i,&itemType,&itemHandle,&itemRect);
  308.             icon = GetCIcon(myButtons.buttonRNum[i]);
  309.             if (icon == NULL) {
  310.                 SysBeep(7);
  311.                 (*myAlert).AlertStop("\pFatal Error",
  312.                             "\pUnable to get cicn resource",
  313.                             "\pVCR::RedrawButtons",NULL);
  314.             }
  315.             HLock(icon);
  316.             PlotCIcon(&itemRect, icon);
  317.             HUnlock(icon);
  318.             DisposCIcon(icon);
  319.         }
  320.     }
  321.     
  322.     //(*this).myButtons = myButtons;
  323.     
  324.     RGBForeColor(&fc);
  325.     RGBBackColor(&bc);
  326.     
  327.     SetPort(oldPort);
  328. }
  329. /*....................................................................*/
  330. void VCR::RedrawStatus()
  331. {
  332.     DialogPtr myDlog;
  333.     int itemType;
  334.     Handle itemHandle;
  335.     Rect itemRect;
  336.     int i;
  337.     GrafPtr oldPort;
  338.     RGBColor fc,bc;
  339.     Buttons myButtons;
  340.  
  341.     
  342.     GetForeColor(&fc);
  343.     GetBackColor(&bc);
  344.     
  345.     
  346.     GetPort(&oldPort);
  347.     myDlog = (*this).myDlog;
  348.     myButtons = (*this).myButtons;
  349.     
  350.     GetDItem(myDlog,STATUS_BOX,&itemType,&itemHandle,&itemRect);
  351.     SetColor(sl_black);
  352.     PaintRect(&itemRect);
  353.     
  354.     SetColor(sl_darkGray);
  355.     
  356.     // draw border    
  357.     MoveTo(itemRect.left,itemRect.bottom + 1);
  358.     LineTo(itemRect.right + 1,itemRect.bottom + 1);
  359.     
  360.     MoveTo(itemRect.right + 1, itemRect.top);
  361.     LineTo(itemRect.right + 1, itemRect.bottom + 1);
  362.     
  363.     UpdateProgress();
  364.     SetPort(oldPort);
  365.     
  366.     RGBForeColor(&fc);
  367.     RGBBackColor(&bc);
  368.     
  369. }
  370. /*....................................................................*/
  371. void VCR::RedrawTime()
  372. {
  373.     DialogPtr myDlog;
  374.     int itemType;
  375.     Handle itemHandle;
  376.     Rect itemRect;
  377.     int i;
  378.     GrafPtr oldPort;
  379.     RGBColor fc,bc;
  380.     DateTimeRec myTime;
  381.     char time[80];
  382.     char day[6];
  383.     
  384.     
  385.     GetForeColor(&fc);
  386.     GetBackColor(&bc);
  387.     
  388.     GetPort(&oldPort);
  389.     myDlog = (*this).myDlog;
  390.     myButtons = (*this).myButtons;
  391.     
  392.     SetPort(myDlog);
  393.     
  394.     GetDItem(myDlog,CLOCK_BOX,&itemType,&itemHandle,&itemRect);
  395.     SetColor(sl_black);
  396.     PaintRect(&itemRect);
  397.     
  398.     SetColor(sl_darkGray);
  399.     // draw border    
  400.     MoveTo(itemRect.left,itemRect.bottom + 1);
  401.     LineTo(itemRect.right + 1,itemRect.bottom + 1);
  402.     
  403.     MoveTo(itemRect.right + 1, itemRect.top);
  404.     LineTo(itemRect.right + 1, itemRect.bottom + 1);
  405.     
  406.     GetTime(&myTime);
  407.     
  408.     switch(myTime.dayOfWeek) {
  409.         case 1:
  410.             sprintf(day,"SUN");
  411.             break;
  412.         case 2:
  413.             sprintf(day,"MON");
  414.             break;
  415.         case 3:
  416.             sprintf(day,"TUE");
  417.             break;
  418.         case 4:
  419.             sprintf(day,"WED");
  420.             break;
  421.         case 5:
  422.             sprintf(day,"THU");
  423.         break;
  424.         case 6:
  425.             sprintf(day,"FRI");
  426.             break;
  427.         case 7:
  428.             sprintf(day,"SAT");
  429.             break;
  430.         default: break;
  431.     }
  432.     
  433.     if (!clockSet) {
  434.         if (blink) {
  435.             SetColor(sl_white);
  436.             sprintf(time,"12:00");
  437.             MoveTo(itemRect.left+12,itemRect.bottom-12);
  438.             DrawString(CtoPstr(time));
  439.             
  440.             //sprintf(day,"???");
  441.             //MoveTo(itemRect.right - 30, itemRect.bottom-12);
  442.             //DrawString(CtoPstr(day));
  443.         }
  444.         
  445.     }
  446.     else {    
  447.         
  448.         if (blink) {
  449.             SetColor(sl_white);
  450.             //sprintf(time,"%02d:%02d %02d",myTime.hour,myTime.minute,myTime.second);
  451.             sprintf(time,"%02d:%02d",myTime.hour,myTime.minute);
  452.             MoveTo(itemRect.left+12,itemRect.bottom-12);
  453.             DrawString(CtoPstr(time));
  454.             
  455.             MoveTo(itemRect.right - 30, itemRect.bottom-12);
  456.             DrawString(CtoPstr(day));
  457.         }
  458.         else {
  459.             SetColor(sl_white);
  460.             //sprintf(time,"%02d %02d %02d",myTime.hour,myTime.minute,myTime.second);
  461.             sprintf(time,"%02d %02d",myTime.hour,myTime.minute);
  462.             MoveTo(itemRect.left+12,itemRect.bottom-12);
  463.             DrawString(CtoPstr(time));
  464.             
  465.             MoveTo(itemRect.right - 30, itemRect.bottom-12);
  466.             DrawString(CtoPstr(day));
  467.         }
  468.     }
  469.     
  470.     
  471.     SetPort(oldPort);
  472.     
  473.     RGBForeColor(&fc);
  474.     RGBBackColor(&bc);
  475. }
  476. /*....................................................................*/
  477. void VCR::UpdateProgress()
  478. {
  479.     DialogPtr myDlog;
  480.     GrafPtr oldPort;
  481.     RGBColor fc,bc;
  482.     Buttons myButtons;
  483.     
  484.     GetForeColor(&fc);
  485.     GetBackColor(&bc);
  486.     
  487.     GetPort(&oldPort);
  488.     myDlog = (*this).myDlog;
  489.     myButtons = (*this).myButtons;
  490.     
  491.     SetPort(myDlog);
  492.     
  493.     newTick = TickCount();
  494.     if (myButtons.button[PLAY_BUTTON] == true) {
  495.         if ( (newTick - oldTick) > 25) {
  496.             int i,j;
  497.             
  498.             i = currentrect;
  499.             currentrect++;
  500.             
  501.             if (currentrect > 3) currentrect = 0;            
  502.             j = currentrect;
  503.             Draw2Rects2Colors(myRects[i],sl_darkGray,myRects[j],sl_white);
  504.             oldTick = newTick;
  505.         }
  506.     }
  507.     else if (myButtons.button[FF_BUTTON] == true) {
  508.         if ( (newTick - oldTick) > 10) {
  509.             int i,j;
  510.             
  511.             i = currentrect;
  512.             currentrect++;
  513.             
  514.             if (currentrect > 3) currentrect = 0;            
  515.             j = currentrect;
  516.             Draw2Rects2Colors(myRects[i],sl_darkGray,myRects[j],sl_white);
  517.             oldTick = newTick;
  518.         }
  519.     }
  520.     else if (myButtons.button[RW_BUTTON] == true) {
  521.         if ( (newTick - oldTick) > 10) {
  522.             int i,j;
  523.             
  524.             i = currentrect;
  525.             
  526.             currentrect--;
  527.                 
  528.             if (currentrect < 0) currentrect = 3;
  529.             j = currentrect;
  530.             
  531.             Draw2Rects2Colors(myRects[i],sl_darkGray,myRects[j],sl_white);
  532.         
  533.             oldTick = newTick;
  534.         }
  535.     }
  536.     else {
  537.         
  538.         if ( (newTick - oldTick) > 120) {    
  539.             DrawAllProgress(sl_darkGray);
  540.             oldTick = newTick;
  541.             currentrect = 0;
  542.  
  543.         }
  544.  
  545.     }
  546.     
  547.     
  548.     
  549.     SetPort(oldPort);
  550.     
  551.     RGBForeColor(&fc);
  552.     RGBBackColor(&bc);
  553. }    
  554. /*....................................................................*/
  555. void VCR::DrawAllProgress(int color)
  556. {
  557.     int i;
  558.     GrafPtr oldPort;
  559.     RGBColor fc,bc;
  560.     
  561.     
  562.     GetForeColor(&fc);
  563.     GetBackColor(&bc);
  564.     
  565.     GetPort(&oldPort);
  566.     myDlog = (*this).myDlog;
  567.     SetPort(myDlog);
  568.     
  569.     SetColor(color);
  570.     for(i = 0; i < 4; i++) {
  571.         PaintRect(&myRects[i]);
  572.     }
  573.     
  574.     SetPort(oldPort);
  575.     
  576.     RGBForeColor(&fc);
  577.     RGBBackColor(&bc);
  578. }
  579. /*....................................................................*/
  580. void VCR::Draw2Rects2Colors(Rect r1, int color1, Rect r2, int color2)
  581. {
  582.     RGBColor fc,bc;
  583.     
  584.     GetForeColor(&fc);
  585.     GetBackColor(&bc);
  586.     
  587.     SetColor(color1);
  588.     PaintRect(&r1);
  589.     SetColor(color2);
  590.     PaintRect(&r2);
  591.     
  592.     RGBForeColor(&fc);
  593.     RGBBackColor(&bc);
  594. }
  595. /*....................................................................*/
  596. void VCR::ClearAllButtons()
  597. {
  598.     Buttons myButtons;
  599.     int i;
  600.     
  601.     myButtons = (*this).myButtons;
  602.     
  603.         
  604.     for(i = 1; i < LAST_BUTTON; i++) {
  605.         myButtons.button[i] = false;
  606.     }
  607.     
  608.     (*this).myButtons = myButtons;
  609.     RedrawButtons();
  610. }